package com.wutong.resonance.model.plugin.visual;

import com.wutong.resonance.model.audio.AudioData;
import com.wutong.resonance.model.audio.AudioParams;
import com.wutong.resonance.model.util.AudioDataUtil;
import javafx.application.Platform;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

/**
 * 中心对称波形时域图
 *
 * @author wutong
 */
@Slf4j
@Getter
@Setter
public class SymmetricWaveformVisualizer extends VisualPlugin {

    public SymmetricWaveformVisualizer(AudioParams audioParams, int initialFrameSize, Pane parent) {
        // 调用父类构造函数, 父类构造函数会创建canvas和gc
        super("中心对称波形时域图", "中心对称波形时域图", parent, audioParams);

        this.audioParams = audioParams;
        this.initialFrameSize = initialFrameSize;
        this.frameSize = initialFrameSize;
        // 获取采样率
        this.sampleRate = audioParams.getSampleRate();
        // 计算更新间隔 (毫秒)
        this.updateRate = (double) frameSize / sampleRate * 1000;


    }
    @Override
    protected void initPlugin(AudioParams audioParams) {
        super.initPlugin(audioParams);
        // 监听画布宽度变化，动态调整 frameSize
        canvas.widthProperty().addListener((obs, oldVal, newVal) -> adjustFrameSize(newVal.doubleValue()));
        // 初始调整
        adjustFrameSize(canvas.getWidth());

        initTimeline();
    }

    @Override
    protected void draw(AudioData audioData) {
        // 获取音频数据
        short[] data = AudioDataUtil.byteArrayToShortArray(audioData.getByteData(), audioData.getAudioParams().getBigEndian());

        // 判断数据是否为空
        if (data.length == 0) {
            return;
        }

        // 在 JavaFX 线程中更新 UI
        Platform.runLater(() -> {
            initDraw();
            // 强制循环到画布边缘
            for (int i = 0; i < frameSize; i++) {
                // 获取数据索引，如果数据长度小于 frameSize，则重复数据
                int dataIndex = i % data.length;

                // 将 short 值转换为 double，并归一化到 [-1, 1] 范围
                double normalizedValue = (double) data[dataIndex] / Short.MAX_VALUE;

                // 计算 y 坐标 (相对于中心线)
                double yOffset = normalizedValue * centerY * 0.4;

                // 计算 x 坐标
                double x = i * xIncrement;

                // 上半部分
                if (i == 0) {
                    gc.moveTo(x, centerY - yOffset);
                } else {
                    gc.lineTo(x, centerY - yOffset);
                }

                //下半部分, 与上半部分对称
                if (i == 0) {
                    gc.moveTo(x, centerY + yOffset);
                } else {
                    gc.lineTo(x, centerY + yOffset);
                }
            }
            gc.stroke();
        });
    }


    /**
     * 插件视图
     *
     * @param parent 父容器
     *
     * @return 插件视图
     */
    @Override
    public Pane view(Pane parent) {
        // 父类已经完成了canvas的添加，这里直接返回null
        return null;
    }
    /**
     * 重新绘制背景
     *
     */
    @Override
    protected void redrawBackground() {
        double width = canvas.getWidth();
        double height = canvas.getHeight();

        // 背景颜色, 从父类获取
        gc.setFill(backgroundColor);
        gc.fillRect(0, 0, width, height);

        // 绘制中心线
        gc.setStroke(Color.GRAY);
        gc.setLineWidth(0.5);
        gc.strokeLine(0, height / 2, width, height / 2);
    }


    @Override
    protected void unloadPlugin() {
        // 调用父类的卸载方法
        super.unloadPlugin();
        // 停止 timeline
        stop();
    }
}
